package com.util;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.io.File;
import java.sql.Types;
import java.util.Collections;

public class AutoGenerator {

    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");

        FastAutoGenerator.create(
                "jdbc:mysql://localhost:3306/bilibili?useSSL=false&useUnicode=true&characterEncoding=utf-8" +
                        "&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true",
                "root", // 数据库配置
                "")
                .globalConfig(builder -> {
                    builder.author("sly") // 设置作者
                            .disableOpenDir() // 生成完不打开文件夹
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir(projectPath + File.separator + "generator"); // 指定输出目录
                })
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.SMALLINT) {
                        // 自定义类型转换
                        return DbColumnType.INTEGER;
                    }
                    if (typeCode == Types.TIMESTAMP) {
                        // 日期类型转换
                        return DbColumnType.DATE;
                    }
                    return typeRegistry.getColumnType(metaInfo);
                }))
                .packageConfig(builder -> {
                    builder.parent("com") // 设置父包名
                            .moduleName("") // 设置父包模块名
                            .entity("domain")
                            .serviceImpl("service.impl")
                            .mapper("mapper")
                            .xml("mapper.system")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + File.separator + "generator")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("t_chat_user_rela") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_") // 设置过滤表前缀
                            .entityBuilder().enableLombok().enableTableFieldAnnotation().idType(IdType.AUTO).enableRemoveIsPrefix().formatFileName("%sEntity")
                            // entity设置，lombok开启，开启生成实体时生成字段注解，主键自增,格式化生成的Entity的拼接名称
//                            .superClass(BaseEntity.class)   // 继承通用Entity
                            .controllerBuilder().enableRestStyle().formatFileName("%sController")
                            // controller设置，restController开启,格式化生成的Controller的拼接名称
//                            .superClass(BaseController.class)   // 继承通用Controller
                            .serviceBuilder().enableFileOverride().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl")
                            // service设置，格式化生成的Service的拼接名称
                            .mapperBuilder().enableBaseResultMap().enableBaseColumnList().formatMapperFileName("%sMapper").formatXmlFileName("%sMapper")
                            // mapper设置，baseResult开启，格式化生成的Mapper\xml的拼接名称
                            .mapperAnnotation(org.apache.ibatis.annotations.Mapper.class)
                    // mapper注解开启
                    ;
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}